#ifndef DEVICEMANAGEMENTPLUGIN_H
#define DEVICEMANAGEMENTPLUGIN_H

#include "CameraPluginInterface.h"
#include "DeviceManagementWidget.h"
#include "SDKManager.h"
#include <QObject>

/**
 * @brief DeviceManagementPlugin类 - 设备管理插件
 * @details 该类是设备管理插件的主类，继承自CameraPluginInterface接口
 *          负责设备的发现、连接、断开连接以及参数管理
 *          管理SDK插件的加载和设备事件的处理
 */
class DeviceManagementPlugin :public CameraPluginInterface {
    Q_OBJECT
    Q_INTERFACES(CameraPluginInterface)
    Q_PLUGIN_METADATA(IID "Camera.CameraPluginInterface/1.0")
    Q_PROPERTY(QString pluginName READ pluginName CONSTANT)
    Q_PROPERTY(QString description READ description CONSTANT)
public:
    /**
     * @brief 构造函数
     * @param parent 父对象指针，用于内存管理
     */
    Q_INVOKABLE explicit DeviceManagementPlugin(QObject *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    ~DeviceManagementPlugin() override;

    /**
     * @brief 初始化插件
     * @details 加载SDK插件，初始化设备管理界面，建立信号槽连接
     */
    void initialize() override;
    
    /**
     * @brief 获取插件名称
     * @return 插件名称字符串
     */
    QString pluginName() const override;
    
    /**
     * @brief 获取插件描述
     * @return 插件描述字符串
     */
    QString description() const override;
    
    /**
     * @brief 设置图像采集回调
     * @param deviceId 设备ID
     * @param pObject 对象指针
     * @param callback 回调函数
     * @return 操作结果
     */
    Q_INVOKABLE QVariant setImageCaptureCallback(const QVariant& deviceId, QVariant pObject, QVariant callback);
    
public slots:
    /**
     * @brief 通用消息接收槽（支持跨插件调用）
     * @param sender 发送者名称
     * @param message 消息内容
     */
    void onPluginMessage(const QString& sender, const QString& message) override;
    
private slots:
    /**
     * @brief 相机连接事件槽
     * @param deviceId 设备ID
     */
    void onCameraConnected(const QString& deviceId);
    
    /**
     * @brief 相机断开连接事件槽
     * @param deviceId 设备ID
     */
    void onCameraDisconnected(const QString& deviceId);
    
    /**
     * @brief 接收日志信号
     * @param logInfo 日志信息
     * @param logLevel 日志级别（默认0）
     * @param isSave 是否保存到文件（默认false）
     */
    void onWriteLog(const QString& logInfo, int logLevel=0, bool isSave=false);
    
    /**
     * @brief 设置配置
     * @param configName 配置名称
     * @param params 配置参数
     */
    void onSetConfig(const QString& configName, const QVariantMap& params);
    
private:
    /**
     * @brief 设备管理界面指针
     */
    DeviceManagementWidget* m_pDeviceManagementWidget = nullptr;
    
    /**
     * @brief 设备管理器指针
     */
    SDKManager* m_SDKManager;
    
    /**
     * @brief 当前连接设备ID
     */
    QString m_ConnectedId;
};

#endif // DEVICEMANAGEMENTPLUGIN_H
